<html>
    <head>
        <title> 额外属性系统，针对EF Core实体的扩展</title>
    </head>
    <body>
        <script>
             /*
                        二、EF Core 实体扩展

                                如上所述，实体的所有额外属性都作为单个JSON对象存储在数据库表中。
                                
                                这不是很自然，尤其是当你想如下做的时候：

                                    ①、为额外属性创建索引和外键。

                                    ②、使用额外属性（例如，按属性值搜索表）写入SQL或LINQ。

                                    ③、创建你自己的实体映射到同一个表，但将额外的属性定义为实体中的常规属性（有关详细信息，请参阅EF Core迁移文档）。

                                为了克服上述困难，"额外属性系统"针对 Entity Framework Core ，它允许你使用上面定义的相同的额外属性API,但将所需属性存储为数据库表中的单独字段。

                                假设要将SocialSecurityNumber添加到Identity Module的IdentityUser实体。你可以使用ObjectExtensionManager：

                                          ObjectExtensionManager.Instance
                                                                .MapEfCoreProperty<IdentityUser, string>(  // 配置到数据库表独立字段的映射
                                                                    "SocialSecurityNumber",
                                                                    (entityBuilder, propertyBuilder) =>
                                                                    {
                                                                        propertyBuilder.HasMaxLength(32);
                                                                    }  

                                        你提供了IdentityUser作为实体名称，string作为新属性的类型，SocialSecurityNumber作为属性名称（也是数据库表中的字段名称）。    

                                        你还需要提供一个使用EF Core Fluent API定义数据库映射属性的操作。

                                备注： 此代码部分必须在使用相关的DbContext之前执行。

                                      应用程序启动模板定义了一个名为YourProjectNameEfCoreEntityExtensionMappings的静态类。
                                      
                                      你可以在该类中定义你的扩展以确保它在适当的时间执行。否则  ，你应该自己处理。

                            
                                定义实体扩展后，你需要使用EF Core的标准Add-迁移和Update-Database命令来创建代码优先迁移类并更新数据库。

                                然后，你可以使用上一节中定义的相同额外属性系统来操作实体上的属性。
                    */

        </script>
    </body>
</html>